g_object_unref (task);
}
-static void
-ostree_fetcher_mirrored_request_internal (OstreeFetcher *self,
- GPtrArray *mirrorlist,
- const char *filename,
- gboolean is_stream,
- guint64 max_size,
- int priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data,
- gpointer source_tag)
+void
+_ostree_fetcher_request_async (OstreeFetcher *self,
+ GPtrArray *mirrorlist,
+ const char *filename,
+ OstreeFetcherRequestFlags flags,
+ guint64 max_size,
+ int priority,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
g_autoptr(GTask) task = NULL;
OstreeFetcherPendingURI *pending;
pending->mirrorlist = g_ptr_array_ref (mirrorlist);
pending->filename = g_strdup (filename);
pending->max_size = max_size;
- pending->is_stream = is_stream;
+ pending->is_stream = (flags & OSTREE_FETCHER_REQUEST_FLAG_ENABLE_PARTIAL) == 0;
task = g_task_new (self, cancellable, callback, user_data);
- g_task_set_source_tag (task, source_tag);
+ g_task_set_source_tag (task, _ostree_fetcher_request_async);
g_task_set_task_data (task, pending, (GDestroyNotify) pending_uri_unref);
/* We'll use the GTask priority for our own priority queue. */
(GDestroyNotify) g_object_unref);
}
-void
-_ostree_fetcher_mirrored_request_with_partial_async (OstreeFetcher *self,
- GPtrArray *mirrorlist,
- const char *filename,
- guint64 max_size,
- int priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- ostree_fetcher_mirrored_request_internal (self, mirrorlist, filename, FALSE,
- max_size, priority, cancellable,
- callback, user_data,
- _ostree_fetcher_mirrored_request_with_partial_async);
-}
-
-char *
-_ostree_fetcher_mirrored_request_with_partial_finish (OstreeFetcher *self,
- GAsyncResult *result,
- GError **error)
+gboolean
+_ostree_fetcher_request_finish (OstreeFetcher *self,
+ GAsyncResult *result,
+ char **out_filename,
+ GInputStream **out_stream,
+ GError **error)
{
- g_return_val_if_fail (g_task_is_valid (result, self), NULL);
- g_return_val_if_fail (g_async_result_is_tagged (result,
- _ostree_fetcher_mirrored_request_with_partial_async), NULL);
-
- return g_task_propagate_pointer (G_TASK (result), error);
-}
+ GTask *task;
+ OstreeFetcherPendingURI *pending;
+ gpointer ret;
+
+ g_return_val_if_fail (g_task_is_valid (result, self), FALSE);
+ g_return_val_if_fail (g_async_result_is_tagged (result, _ostree_fetcher_request_async), FALSE);
+
+ /* Special dance to implement
+ enum FetchResult {
+ Filename(String path),
+ Membuf(uint8[])
+ } in Rust terms
+ */
+ task = (GTask*)result;
+ pending = g_task_get_task_data (task);
-static void
-ostree_fetcher_stream_mirrored_uri_async (OstreeFetcher *self,
- GPtrArray *mirrorlist,
- const char *filename,
- guint64 max_size,
- int priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- ostree_fetcher_mirrored_request_internal (self, mirrorlist, filename, TRUE,
- max_size, priority, cancellable,
- callback, user_data,
- ostree_fetcher_stream_mirrored_uri_async);
-}
+ ret = g_task_propagate_pointer (task, error);
+ if (!ret)
+ return FALSE;
-static GInputStream *
-ostree_fetcher_stream_mirrored_uri_finish (OstreeFetcher *self,
- GAsyncResult *result,
- GError **error)
-{
- g_return_val_if_fail (g_task_is_valid (result, self), NULL);
- g_return_val_if_fail (g_async_result_is_tagged (result,
- ostree_fetcher_stream_mirrored_uri_async), NULL);
+ if (pending->is_stream)
+ {
+ g_assert (out_stream);
+ *out_stream = ret;
+ }
+ else
+ {
+ g_assert (out_filename);
+ *out_filename = ret;
+ }
- return g_task_propagate_pointer (G_TASK (result), error);
+ return TRUE;
}
guint64
{
FetchUriSyncData *data = user_data;
- data->result_stream = ostree_fetcher_stream_mirrored_uri_finish ((OstreeFetcher*)object,
- result, data->error);
+ (void)_ostree_fetcher_request_finish ((OstreeFetcher*)object,
+ result, NULL, &data->result_stream,
+ data->error);
data->done = TRUE;
}
data.done = FALSE;
data.error = error;
- ostree_fetcher_stream_mirrored_uri_async (fetcher, mirrorlist, filename, max_size,
- OSTREE_FETCHER_DEFAULT_PRIORITY, cancellable,
- fetch_uri_sync_on_complete, &data);
+ _ostree_fetcher_request_async (fetcher, mirrorlist, filename, 0, max_size,
+ OSTREE_FETCHER_DEFAULT_PRIORITY, cancellable,
+ fetch_uri_sync_on_complete, &data);
while (!data.done)
g_main_context_iteration (mainctx, TRUE);
guint64 _ostree_fetcher_bytes_transferred (OstreeFetcher *self);
-void _ostree_fetcher_mirrored_request_with_partial_async (OstreeFetcher *self,
- GPtrArray *mirrorlist,
- const char *filename,
- guint64 max_size,
- int priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-
-char *_ostree_fetcher_mirrored_request_with_partial_finish (OstreeFetcher *self,
- GAsyncResult *result,
- GError **error);
+typedef enum {
+ OSTREE_FETCHER_REQUEST_FLAG_ENABLE_PARTIAL = (1 << 0)
+} OstreeFetcherRequestFlags;
+
+void _ostree_fetcher_request_async (OstreeFetcher *self,
+ GPtrArray *mirrorlist,
+ const char *filename,
+ OstreeFetcherRequestFlags flags,
+ guint64 max_size,
+ int priority,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean _ostree_fetcher_request_finish (OstreeFetcher *self,
+ GAsyncResult *result,
+ char **out_filename,
+ GInputStream **out_stream,
+ GError **error);
gboolean _ostree_fetcher_mirrored_request_to_membuf (OstreeFetcher *fetcher,
GPtrArray *mirrorlist,
OstreeObjectType objtype;
gboolean free_fetch_data = TRUE;
- temp_path = _ostree_fetcher_mirrored_request_with_partial_finish (fetcher, result, error);
- if (!temp_path)
+ if (!_ostree_fetcher_request_finish (fetcher, result, &temp_path, NULL, error))
goto out;
ostree_object_name_deserialize (fetch_data->object, &checksum, &objtype);
g_debug ("fetch of %s%s complete", checksum_obj,
fetch_data->is_detached_meta ? " (detached)" : "");
- temp_path = _ostree_fetcher_mirrored_request_with_partial_finish (fetcher, result, error);
- if (!temp_path)
+ if (!_ostree_fetcher_request_finish (fetcher, result, &temp_path, NULL, error))
{
if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
{
g_debug ("fetch static delta part %s complete", fetch_data->expected_checksum);
- temp_path = _ostree_fetcher_mirrored_request_with_partial_finish (fetcher, result, error);
- if (!temp_path)
+ if (!_ostree_fetcher_request_finish (fetcher, result, &temp_path, NULL, error))
goto out;
fd = openat (_ostree_fetcher_get_dfd (fetcher), temp_path, O_RDONLY | O_CLOEXEC);
else
expected_max_size = 0;
- _ostree_fetcher_mirrored_request_with_partial_async (pull_data->fetcher, mirrorlist,
- obj_subpath, expected_max_size,
- is_meta ? OSTREE_REPO_PULL_METADATA_PRIORITY
- : OSTREE_REPO_PULL_CONTENT_PRIORITY,
- pull_data->cancellable,
- is_meta ? meta_fetch_on_complete : content_fetch_on_complete, fetch_data);
+ _ostree_fetcher_request_async (pull_data->fetcher, mirrorlist,
+ obj_subpath, OSTREE_FETCHER_REQUEST_FLAG_ENABLE_PARTIAL,
+ expected_max_size,
+ is_meta ? OSTREE_REPO_PULL_METADATA_PRIORITY
+ : OSTREE_REPO_PULL_CONTENT_PRIORITY,
+ pull_data->cancellable,
+ is_meta ? meta_fetch_on_complete : content_fetch_on_complete, fetch_data);
}
static gboolean
}
else
{
- _ostree_fetcher_mirrored_request_with_partial_async (pull_data->fetcher,
- pull_data->content_mirrorlist,
- deltapart_path, size,
- OSTREE_FETCHER_DEFAULT_PRIORITY,
- pull_data->cancellable,
- static_deltapart_fetch_on_complete,
- fetch_data);
+ _ostree_fetcher_request_async (pull_data->fetcher,
+ pull_data->content_mirrorlist,
+ deltapart_path, OSTREE_FETCHER_REQUEST_FLAG_ENABLE_PARTIAL,
+ size,
+ OSTREE_FETCHER_DEFAULT_PRIORITY,
+ pull_data->cancellable,
+ static_deltapart_fetch_on_complete,
+ fetch_data);
pull_data->n_outstanding_deltapart_fetches++;
}
}